﻿Public Class FrmPuc
    Private Cta As GBDZafiro.PlanCuentas
    Private result As New GBDZafiro.Resultado

    Private Sub FrmPuc_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        cargargvPuc()
    End Sub

    Protected Overrides Sub bnNuevo_Click(sender As Object, e As System.EventArgs)
        MyBase.bnNuevo_Click(sender, e)
        nuevo()
    End Sub

    Protected Overrides Sub bnGuardar_Click(sender As Object, e As System.EventArgs)
        If validarCampos() Then
            If ValidarTipo() Then

                Cta = crearCta()
                If GBDZafiro.PlanCuentas.exist(Cta) Then
                    result = GBDZafiro.PlanCuentas.Actualizar(Cta)
                    result.ExisteError = Not result.ExisteError

                Else
                    result = GBDZafiro.PlanCuentas.Nuevo(Cta)

                End If

                If result.ExisteError Then
                    msnBox.msnExclamacion(result.Mensaje)
                Else
                    MyBase.bnGuardar_Click(sender, e)
                    cargargvPuc()
                End If

            End If
        End If
    End Sub

    Protected Overrides Sub bnEditar_Click(sender As Object, e As System.EventArgs)
        MyBase.bnEditar_Click(sender, e)
        gbTipo.Enabled = False
        tbCodigo.Enabled = False
    End Sub

    Protected Overrides Sub bnEliminar_Click(sender As Object, e As System.EventArgs)
        Dim ban As Boolean = True
        If tbCodigo.TextLength < 1 Then
            msnBox.msnExclamacion("No ha seleccionado la cuenta!!!")

        Else
            Cta = crearCta()
            result.ExisteError = False

            If rbNivel.Checked Then
                Dim DtCtaAux As DataTable = GBDZafiro.PlanCuentas.ConsCtasAux(Cta)
                For Each rCta As DataRow In DtCtaAux.Rows
                    If GBDZafiro.DComprobante.existCuenta(rCta("COD_CUENTA")) Then
                        msnBox.msnExclamacion("Las cuentas auxiliares de esta cuenta presentan movimientos!!!")
                        Exit Sub
                    End If
                Next
                result = GBDZafiro.PlanCuentas.Eliminar(Cta)

            ElseIf GBDZafiro.DComprobante.existCuenta(tbCodigo.Text) Then
                result.Mensaje = "Imposible eliminar la cuenta, porque presenta movimientos!!!"

            Else
                If msnBox.msnQuestion("¿Desea borrar la Cuenta ?") = Windows.Forms.DialogResult.Yes Then
                    result = GBDZafiro.PlanCuentas.Eliminar(Cta)
                Else
                    ban = False
                End If

            End If

            If Not result.ExisteError Then
                If ban Then
                    msnBox.msnExclamacion(result.Mensaje)
                End If
            Else
                MyBase.bnEliminar_Click(sender, e)
                cargargvPuc()
            End If

        End If
    End Sub

    Private Sub btImprimir_Click(sender As System.Object, e As System.EventArgs) Handles btImprimir.Click
        If Not gvPuc.Rows.Count < 1 Then
            Dim frmRptPCta As New FrmRptPlanCuentas(crearDtPlanCta())
            frmRptPCta.Show()
        End If
    End Sub

    Private Sub btExcel_Click(sender As System.Object, e As System.EventArgs) Handles btExcel.Click
        If Not gvPuc.Rows.Count < 1 Then
            Utilidades.ExportarExcel(crearDtPlanCta(), "PLAN DE CUENTAS")
        End If
    End Sub

    Private Sub btprimero_Click(sender As System.Object, e As System.EventArgs) Handles btprimero.Click
        gvPuc.CurrentCell = gvPuc.Rows(0).Cells(0)
    End Sub

    Private Sub btAtras_Click(sender As System.Object, e As System.EventArgs) Handles btAtras.Click
        Dim rPlanCta As DataGridViewRow = gvPuc.CurrentRow
        If rPlanCta IsNot Nothing Then
            If Not rPlanCta.Index = 0 Then
                gvPuc.CurrentCell = gvPuc.Rows(rPlanCta.Index - 1).Cells(0)
            End If
        End If
    End Sub

    Private Sub btAdelante_Click(sender As System.Object, e As System.EventArgs) Handles btAdelante.Click
        Dim rPlanCta As DataGridViewRow = gvPuc.CurrentRow
        If rPlanCta IsNot Nothing Then
            If Not rPlanCta.Index = gvPuc.Rows.Count - 1 Then
                gvPuc.CurrentCell = gvPuc.Rows(rPlanCta.Index + 1).Cells(0)
            End If
        End If
    End Sub

    Private Sub btUltimo_Click(sender As System.Object, e As System.EventArgs) Handles btUltimo.Click
        'gvPuc.Rows(gvPuc.Rows.Count - 1).Selected = True
        gvPuc.CurrentCell = gvPuc.Rows(gvPuc.Rows.Count - 1).Cells(0)
    End Sub

    Private Sub tbCodigo_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles tbCodigo.KeyPress
        Validaciones.SoloNumeros(sender, e)
    End Sub

    Private Sub tbBaseRet_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles tbBaseRet.KeyPress
        Validaciones.SoloNumeros(sender, e)
    End Sub

    Private Sub tbBaseRet_Leave(sender As System.Object, e As System.EventArgs) Handles tbBaseRet.Leave
        If Not tbBaseRet.TextLength < 1 Then
            Dim a As Integer = CInt(tbBaseRet.Text)
            If a > 100 Then
                msnBox.msnExclamacion("Maximo 100% en la base de retención")
                tbBaseRet.Clear()
            End If
        End If
    End Sub

    Private Sub gvPuc_CurrentCellChanged(sender As System.Object, e As System.EventArgs)

        Dim row As DataGridViewRow = gvPuc.CurrentRow
        tbCodigo.Text = row.Cells("COD_CUENTA").Value
        tbDescripcion.Text = row.Cells("DESCRIPCION").Value
        tbBaseRet.Text = row.Cells("PORC_BASE").Value

        If row.Cells("TERCERO").Value = "S" Then
            cmbTercero.Text = "Si"
        Else
            cmbTercero.Text = "No"
        End If

        If row.Cells("CCOSTO").Value = "S" Then
            cmbCCostos.Text = "Si"
        Else
            cmbCCostos.Text = "No"
        End If

        If row.Cells("NATURALEZA").Value = "D" Then
            cmbNaturaleza.Text = "DÉBITO"
        Else
            cmbNaturaleza.Text = "CRÉDITO"
        End If

        If row.Cells("TIPO_CUENTA").Value = "1" Then
            rbNivel.Checked = True
        Else
            rbAux.Checked = True
        End If

    End Sub

    Private Function validarCampos() As Boolean
        If tbCodigo.TextLength < 1 Or tbDescripcion.TextLength < 1 Or tbBaseRet.TextLength < 1 Then
            msnBox.msnExclamacion("Complete todos los campos!!!")
            Return False
        Else
            Return True
        End If
    End Function

    Private Function ValidarTipo() As Boolean
        Cta = crearCta()
        If GBDZafiro.PlanCuentas.exist(Cta) And GBDZafiro.DComprobante.existCuenta(Cta.COD_CUENTA) Then
            msnBox.msnExclamacion("Imposible actualizar la cuenta, porque presenta movimientos!!!")
            Return False

        ElseIf rbNivel.Checked And GBDZafiro.PlanCuentas.exist(Cta) Then
            Return True

        ElseIf Not tbCodigo.TextLength < 4 And rbNivel.Checked = True Then
            msnBox.msnExclamacion("La cuenta de tipo nivel debe ser menor a 4 digitos")
            Return False

        ElseIf rbAux.Checked And tbCodigo.TextLength < 4 Then
            msnBox.msnExclamacion("La cuenta de tipo auxiliar debe ser mayor o igual a 4 digitos")
            Return False

        ElseIf rbAux.Checked Then
            'Cta = crearCta()
            Cta.COD_CUENTA = Cta.COD_CUENTA.Substring(0, Cta.COD_CUENTA.Length - 2)
            If Not GBDZafiro.PlanCuentas.exist(Cta) Then
                msnBox.msnExclamacion("La Cuenta a crear, no tiene una cuenta de Tipo Nivel")
                Return False

            ElseIf Cta.COD_CUENTA.Length > 18 Then
                msnBox.msnExclamacion("Imposible crear la cuenta, debido a que la cuenta de tipo nivel " + Cta.COD_CUENTA + " es mayor a 18 digitos!!!")
                Return False

            ElseIf GBDZafiro.DComprobante.existCuenta(Cta.COD_CUENTA) Then
                msnBox.msnExclamacion("Imposible crear o actualizar la cuenta, porque la cuenta " + Cta.COD_CUENTA + " presenta movimientos!!!")
                Return False

            Else
                Return True
            End If

        Else
            Return True
        End If
    End Function

    Private Function crearCta() As GBDZafiro.PlanCuentas
        Dim Cta As New GBDZafiro.PlanCuentas
        Cta.COD_CUENTA = tbCodigo.Text
        Cta.DESCRIPCION = tbDescripcion.Text.ToUpper
        Cta.PORC_BASE = CDec(tbBaseRet.Text)

        If cmbNaturaleza.Text = "DÉBITO" Then
            Cta.NATURALEZA = "D"
        Else
            Cta.NATURALEZA = "C"
        End If

        If cmbTercero.Text = "Si" Then
            Cta.TERCERO = "S"
        Else
            Cta.TERCERO = "N"
        End If

        If cmbCCostos.Text = "Si" Then
            Cta.CCOSTO = "S"
        Else
            Cta.CCOSTO = "N"
        End If

        If rbNivel.Checked Then
            Cta.TIPO_CUENTA = "1"
        Else
            Cta.TIPO_CUENTA = "2"
        End If

        Return Cta
    End Function

    Private Sub agregarGvPuc(ByRef Cta As GBDZafiro.PlanCuentas)
        'With Cta
        '    gvPuc.Rows.Add(.COD_CUENTA, .DESCRIPCION, .NATURALEZA, .TIPO_CUENTA, .TERCERO, .CCOSTO, .PORC_BASE, _
        '                   .MES00, .MES01, .MES02, .MES03, .MES04, .MES05, .MES06, .MES07, .MES08, .MES09, .MES10, .MES11, .MES12, .MES13)
        'End With
        cargargvPuc()
    End Sub

    Private Sub cargargvPuc()
        RemoveHandler gvPuc.CurrentCellChanged, AddressOf gvPuc_CurrentCellChanged

        gvPuc.DataSource = Nothing
        gvPuc.DataSource = GBDZafiro.PlanCuentas.ConsultarAll
        'Dim dt As DataTable = GBDZafiro.PlanCuentas.ConsultarAll
        'gvPuc.Rows.Clear()
        'gvPuc.Columns.Clear()

        'For Each c As DataColumn In dt.Columns
        '    gvPuc.Columns.Add(c.ColumnName, c.ColumnName)
        'Next

        'For Each r As DataRow In dt.Rows
        '    For Each c As DataColumn In dt.Columns
        '        gvPuc.Rows.Add(r(c))
        '    Next
        'Next

        With gvPuc
            .Columns("COD_CUENTA").HeaderText = "Codigo"
            .Columns("DESCRIPCION").HeaderText = "Descripción"
            .Columns("MES00").HeaderText = "Inicial"
            .Columns("MES01").HeaderText = "Enero"
            .Columns("MES02").HeaderText = "Febrero"
            .Columns("MES03").HeaderText = "Marzo"
            .Columns("MES04").HeaderText = "Abril"
            .Columns("MES05").HeaderText = "Mayo"
            .Columns("MES06").HeaderText = "Junio"
            .Columns("MES07").HeaderText = "Julio"
            .Columns("MES08").HeaderText = "Agosto"
            .Columns("MES09").HeaderText = "Septiembre"
            .Columns("MES10").HeaderText = "Octubre"
            .Columns("MES11").HeaderText = "Noviembre"
            .Columns("MES12").HeaderText = "Diciembre"
            .Columns("MES13").HeaderText = "Final"

            .Columns("MES00").DefaultCellStyle.Format = "N"
            .Columns("MES01").DefaultCellStyle.Format = "N"
            .Columns("MES02").DefaultCellStyle.Format = "N"
            .Columns("MES03").DefaultCellStyle.Format = "N"
            .Columns("MES04").DefaultCellStyle.Format = "N"
            .Columns("MES05").DefaultCellStyle.Format = "N"
            .Columns("MES06").DefaultCellStyle.Format = "N"
            .Columns("MES07").DefaultCellStyle.Format = "N"
            .Columns("MES08").DefaultCellStyle.Format = "N"
            .Columns("MES09").DefaultCellStyle.Format = "N"
            .Columns("MES10").DefaultCellStyle.Format = "N"
            .Columns("MES11").DefaultCellStyle.Format = "N"
            .Columns("MES12").DefaultCellStyle.Format = "N"
            .Columns("MES13").DefaultCellStyle.Format = "N"

            .Columns("MES00").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES01").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES02").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES03").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES04").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES05").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES06").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES07").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES08").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES09").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES10").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES11").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES12").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .Columns("MES13").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight

            .Columns("NATURALEZA").Visible = False
            .Columns("TIPO_CUENTA").Visible = False
            .Columns("TERCERO").Visible = False
            .Columns("CCOSTO").Visible = False
            .Columns("PORC_BASE").Visible = False
            .Columns("FECHA_REGISTRO").Visible = False

            .Columns("COD_CUENTA").Frozen = True
            .Columns("DESCRIPCION").Frozen = True

        End With
        AddHandler gvPuc.CurrentCellChanged, AddressOf gvPuc_CurrentCellChanged
    End Sub

    Private Sub nuevo()
        rbNivel.Checked = True
        cmbNaturaleza.Text = cmbNaturaleza.Items.Item(0)
        cmbCCostos.Text = cmbCCostos.Items.Item(1)
        cmbTercero.Text = cmbTercero.Items.Item(1)
        tbCodigo.Focus()
    End Sub

    Private Function crearDtPlanCta() As DataTable
        Dim naturaleza, tipo As String
        Me.Enabled = False
        Dim dtPlanCta As New DsZafiro.CONSULPLANCUENTASDataTable
        For Each rPlanCta As DataGridViewRow In gvPuc.Rows

            If rPlanCta.Cells("NATURALEZA").Value = "D" Then
                naturaleza = "Débito"
            Else
                naturaleza = "Crédito"
            End If

            If rPlanCta.Cells("TIPO_CUENTA").Value = "1" Then
                tipo = "Nivel"
            Else
                tipo = "Auxiliar"
            End If

            dtPlanCta.Rows.Add(rPlanCta.Cells("COD_CUENTA").Value, _
                               rPlanCta.Cells("DESCRIPCION").Value, _
                               naturaleza, _
                               tipo, _
                               rPlanCta.Cells("TERCERO").Value, _
                               rPlanCta.Cells("CCOSTO").Value)
        Next

        Me.Enabled = True
        Return dtPlanCta
    End Function

End Class
